Only update Agent's last_event_at on Event creation, not when Events are updated.

Andrew Cantino 9 ans auparavant
Parent
Commettre
142bb35d4e
4 fichiers modifiés avec 47 ajouts et 3 suppressions
  1. 6 1
      app/models/event.rb
  2. 11 0
      db/migrate/20140906030139_set_events_count_default.rb
  3. 2 2
      db/schema.rb
  4. 28 0
      spec/models/event_spec.rb

+ 6 - 1
app/models/event.rb

@@ -14,7 +14,7 @@ class Event < ActiveRecord::Base
14 14
   json_serialize :payload
15 15
 
16 16
   belongs_to :user
17
-  belongs_to :agent, :counter_cache => true, :touch => :last_event_at
17
+  belongs_to :agent, :counter_cache => true
18 18
 
19 19
   has_many :agent_logs_as_inbound_event, :class_name => "AgentLog", :foreign_key => :inbound_event_id, :dependent => :nullify
20 20
   has_many :agent_logs_as_outbound_event, :class_name => "AgentLog", :foreign_key => :outbound_event_id, :dependent => :nullify
@@ -23,6 +23,7 @@ class Event < ActiveRecord::Base
23 23
     where("events.created_at > ?", timespan)
24 24
   }
25 25
 
26
+  after_create :update_agent_last_event_at
26 27
   after_create :possibly_propagate
27 28
 
28 29
   # Emit this event again, as a new Event.
@@ -40,6 +41,10 @@ class Event < ActiveRecord::Base
40 41
 
41 42
   protected
42 43
 
44
+  def update_agent_last_event_at
45
+    agent.touch :last_event_at
46
+  end
47
+
43 48
   def possibly_propagate
44 49
     #immediately schedule agents that want immediate updates
45 50
     propagate_ids = agent.receivers.where(:propagate_immediately => true).pluck(:id)

+ 11 - 0
db/migrate/20140906030139_set_events_count_default.rb

@@ -0,0 +1,11 @@
1
+class SetEventsCountDefault < ActiveRecord::Migration
2
+  def up
3
+    change_column_default(:agents, :events_count, 0)
4
+    change_column_null(:agents, :events_count, false, 0)
5
+  end
6
+
7
+  def down
8
+    change_column_null(:agents, :events_count, true)
9
+    change_column_default(:agents, :events_count, nil)
10
+  end
11
+end

+ 2 - 2
db/schema.rb

@@ -11,7 +11,7 @@
11 11
 #
12 12
 # It's strongly recommended that you check this file into your version control system.
13 13
 
14
-ActiveRecord::Schema.define(version: 20140820003139) do
14
+ActiveRecord::Schema.define(version: 20140906030139) do
15 15
 
16 16
   # These are extensions that must be enabled in order to support this database
17 17
   enable_extension "plpgsql"
@@ -32,7 +32,7 @@ ActiveRecord::Schema.define(version: 20140820003139) do
32 32
     t.string   "type",                                                                                      collation: "utf8_bin"
33 33
     t.string   "name",                                                                  charset: "utf8mb4", collation: "utf8mb4_bin"
34 34
     t.string   "schedule",                                                                                  collation: "utf8_bin"
35
-    t.integer  "events_count"
35
+    t.integer  "events_count",                             default: 0,     null: false
36 36
     t.datetime "last_check_at"
37 37
     t.datetime "last_receive_at"
38 38
     t.integer  "last_checked_event_id"

+ 28 - 0
spec/models/event_spec.rb

@@ -87,6 +87,34 @@ describe Event do
87 87
       agent_logs(:log_for_bob_website_agent).reload.outbound_event_id.should be_nil
88 88
     end
89 89
   end
90
+
91
+  describe "caches" do
92
+    describe "when an event is created" do
93
+      it "updates a counter cache on agent" do
94
+        lambda {
95
+          agents(:jane_weather_agent).events.create!(:user => users(:jane))
96
+        }.should change { agents(:jane_weather_agent).reload.events_count }.by(1)
97
+      end
98
+
99
+      it "updates last_event_at on agent" do
100
+        lambda {
101
+          agents(:jane_weather_agent).events.create!(:user => users(:jane))
102
+        }.should change { agents(:jane_weather_agent).last_event_at }
103
+      end
104
+    end
105
+
106
+    describe "when an event is updated" do
107
+      it "does not touch the last_event_at on the agent" do
108
+        event = agents(:jane_weather_agent).events.create!(:user => users(:jane))
109
+
110
+        agents(:jane_weather_agent).update_attribute :last_event_at, 2.days.ago
111
+
112
+        lambda {
113
+          event.update_attribute :payload, { 'hello' => 'world' }
114
+        }.should_not change { agents(:jane_weather_agent).reload.last_event_at }
115
+      end
116
+    end
117
+  end
90 118
 end
91 119
 
92 120
 describe EventDrop do